package org.dromara.job.task;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * 公司评分统计更新定时任务
 * 负责定时调用存储过程更新企业维度评分和综合评分统计
 *
 * @author system
 * @date 2024-05-20
 */
@Slf4j
@Component
public class CompanyRatingStatisticsTask {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    /**
     * 每天凌晨1点执行公司评分统计更新
     * 使用cron表达式：秒 分 时 日 月 周 年（年可选）
     * 0 0 1 * * ? 表示每天凌晨1点执行
     */
    @Scheduled(cron = "0 0 1 * * ?")
    public void updateCompanyRatingStatistics() {
        log.info("开始执行公司评分统计更新任务");
        try {
            // 1. 首先更新所有企业的维度评分统计
            log.info("开始调用UpdateAllCompanyDimensionStatistics存储过程");
            jdbcTemplate.execute("CALL UpdateAllCompanyDimensionStatistics()");
            log.info("UpdateAllCompanyDimensionStatistics存储过程执行完成");

            // 2. 获取所有需要更新综合评分的企业ID
            log.info("开始获取需要更新综合评分的企业ID列表");
            List<Long> companyIds = jdbcTemplate.queryForList(
                "SELECT DISTINCT company_id FROM xiaofu_company_dimension_statistics",
                Long.class);
            log.info("共获取到 {} 家企业需要更新综合评分", companyIds.size());

            // 3. 为每家企业更新综合评分统计
            for (Long companyId : companyIds) {
                try {
                    log.debug("开始为企业ID: {} 更新综合评分统计", companyId);
                    jdbcTemplate.update("CALL UpdateCompanyOverallStatistics(?)", companyId);
                    log.debug("企业ID: {} 综合评分统计更新完成", companyId);
                } catch (Exception e) {
                    log.error("为企业ID: {} 更新综合评分统计失败", companyId, e);
                    // 继续处理下一家企业，不中断整个任务
                }
            }

            log.info("公司评分统计更新任务执行完成");
        } catch (Exception e) {
            log.error("公司评分统计更新任务执行失败", e);
        }
    }

    /**
     * 提供手动触发更新的方法，可通过API调用
     */
    public void triggerUpdateManually() {
        log.info("手动触发公司评分统计更新任务");
        updateCompanyRatingStatistics();
    }
}
